﻿using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace 节拍计算器2
{
    public static class 日志
    {
        public static bool 总开关 = true;
        public static bool 启用文件输出 = true;
        public static string 输出文件位置 = "日志.txt";
        public static int 日志输出失败次数 = 0;
        public static int 日志输出最大失败次数 = 10;
        public static 日志类型 日志等级 = 日志类型.消息;
        public enum 日志类型
        {
            消息,
            警告,
            错误,
        }

        public static void 输出(string 日志内容, string 日志标题 = "默认", 日志类型 类型 = 日志类型.消息, bool 是否弹窗 = false)
        {
            if (!总开关) { return; }
            if (类型 < 日志等级) { return; }
            var 输出内容 = $"{DateTime.Now} {类型} - {日志标题} | {日志内容}";
            Console.WriteLine(输出内容);
            if (启用文件输出)
            {
                Task.Run(() => { 将日志输出到文件(输出内容); });
            }
            if (是否弹窗)
            {
                MessageBox.Show(日志内容, 日志标题);
            }
        }

        private async static void 将日志输出到文件(string 输出内容)
        {
            try
            {
                var 文件 = File.AppendText(输出文件位置);
                await Task.Run(() =>
                {
                    文件.WriteLineAsync(输出内容);
                    文件.Dispose();
                });
            }
            catch (Exception ex)
            {
                日志输出失败次数++;
                Debug.WriteLine($"日志无法输出到文件，正在重试，当前为第{日志输出失败次数}/{日志输出最大失败次数}次");
                if (日志输出失败次数 >= 日志输出最大失败次数) { 启用文件输出 = false; 日志.输出("日志无法被输出，文件似乎正被占用", "文件记录失败", 日志等级 = 日志类型.错误); return; }
                Thread.Sleep(1000);
                将日志输出到文件(输出内容);
                Debug.WriteLine($"日志输出已恢复正常，共尝试{日志输出失败次数}次");
                日志输出失败次数 = 0;
            }

        }
    }
}
